package com.company.Dynamic;

public class MinimumOneBitOperations {
    public int minimumOneBitOperations(int n) {
        return getMinOperation(n);
    }

    public int getMinOperation(int number){
        if (number==0) {
            return 0;
        }
        int o1 = operate1(number);
        int o2 = operate2(number);

        int minOperation1 = getMinOperation(o1); //第一次进行了操作1 新数字的最小操作
        int minOperation2 = getMinOperation(o2);
        return Math.min(minOperation1,minOperation2);
    }

    /*翻转 n 的二进制表示中最右侧位（第 0 位）。*/
    private int operate1(int n){
        int maskL = 0x01; //  00000001
        int maskH = 0xff -1;// 11111110

        int h = n&maskH;
        int l = n&maskL;

        return h+~l;
    }
    /*如果第 (i-1) 位为 1 且从第 (i-2) 位到第 0 位都为 0，则翻转 n 的二进制表示中的第 i 位。*/
    private int operate2(int n){
        return n;
    }
}
